#ifndef  __MESSAGE_HANDLER__
#define __MESSAGE_HANDLER__
#include "Type_Define.h"

 
#include "IO_LINK_Global_Param.h"
#include "IO_LINK_DataBuffer.h"
#include "DL_OD_Handler.h"
#include "DL_PD_Handler.h"
#include "DL_EH.h"
#include "DL_ISDU_Handler.h"
#include "DL_CH.h"
#include "SM.h"



//服务原语中涉及的数据类型
typedef enum {
  Inactive_0,
  AwaitReply_1,
  MH_Startup_2,
  Response_3,
  AwaitReply_4,
  ErrorHandling_5,
  Preoperate_6,
  GetOD_7,
  Response_8,
  AwaitReply_9,
  Error_Handling_10,
  CheckHandler_11,
  Operate_12,
  GetPD_13,
  GetOD_14,
  Response_15,
  AwaitReply_16,
  ErrorHandling_17
}DL_MessageHandler_STATE_TYPE;



typedef struct{
	

	
	 DirectionTypeDef Dirction;  //读写方向，                                  值 依据服务或服务状态决定
	uint8_t * MC; //  位置位于BasicBufferInOut[Port][3]地址处，其值依据服务或服务状态决定
   uint8_t * CKT; //位置于BasicBufferInOut[Port][4]地址处，       值Max14819自动计算
	
   uint8_t *OD ;   //位置由Mode的状态决定，                               值依据OD服务或服务状态决定
 uint8_t ODLength;                                                                          //值依Mode的状态决定
	
   uint8_t * PDout;//位置由Mode的状态决定，                             值依据PD服务或服务状态决定 
	uint8_t PDOutputLength;                                                             //值依Mode的状态决定
	
   uint8_t * PDin;  //位置由Mode的状态决定，                             值依据PD服务或服务状态决定 
	  uint8_t PDInputLength;                                                               //值依Mode的状态决定
	
   uint8_t *CKS;   //位置由Mode的状态决定                                 值由从站决定
	 
	
                                                                    
   uint16_t M_squenceTime;                                                           //值依Mode的状态决定
   M_sequnceTypeDef M_sequenceType;                                   //值依Mode的状态决定
  
   
	
	uint8_t * RxBytes; //位置固定等于BasicBufferInOut[Port][1]，  其值由MC读写方向决定，为MC接收长度（注意，不等于SPI接口接收长度）
	uint8_t * TxBytes; //位置固定等于BasicBufferInOut[Port][2]  ，其值由MC读写方向决定，为MC发送长度
  
	 
	 uint8_t * RecevieBuffer; //SPI接收缓冲，根据不同MType，等于*OD或者*PD ，依据读写方向决定************************
   uint8_t   SPI_Rx_Bytes;
	 
 
	    //以下变量为一对，送到SPI发送区的数据机器长度
	 uint8_t * SendBuffer;    //发送缓冲，固定等于BasicBufferInOut[Port][0] 
   uint8_t SPI_Tx_Bytes;//SPI发送的字节数==TxBytes+3（Command+RxBytes+TxBytes），依据读写方向而定
   

}MC_Struct_TypeDef; //每次调用DL—SetMode服务，更新此表，MH Mode ISDU 公用
 

void DL_MH_Init(void);
void Event_PD(uint8_t Port);
void Event_Idle(uint8_t Port);
void Event_Not_idle(uint8_t Port);

void Event_MH_Conf_COMx(uint8_t Port);
void Event_MH_Conf_PREOPERATE(uint8_t Port);
void Event_MH_Conf_Startup(uint8_t Port);
void Event_MH_Conf_OPERATE(uint8_t Port);
void Event_MH_Conf_INACTIVE(uint8_t Port);

void Event_tm_TM_sequence(uint8_t Port);

void Event_Response_not_OK(uint8_t Port);
void Event_Response_OK(uint8_t Port);

void Event_No_error(uint8_t Port);

void Event_DL_Read(uint8_t Port);
void Event_DL_ReadParam(uint8_t Port);
void Event_DL_WriteParam(uint8_t Port);
void Event_MH_DL_Write_DEVICEMODE(uint8_t Port);

void Event_DL_Write(uint8_t Port);
void Event_OD(uint8_t Port);
 void Event_OD_Tinitcyc(uint8_t Port);
void Event_Retry_equel_MaxRetry(uint8_t Port);

void Event_Tcyc(uint8_t Port);
void Event_tm_Tinitcyc(uint8_t Port);
//向外发送的Event

 void Event_DL_Write_Cnf(uint8_t Port);
void Event_DL_ISDUTransport(uint8_t Port);

//更新发送数据结构
 void MY_Update_MC_Struct2(uint8_t Port);

extern MC_Struct_TypeDef MC_Struct[PORT_NUM]; //DL_SetMode服务需要修改此数据结构
//Mesage handler参数数据

extern DL_MessageHandler_STATE_TYPE DL_MH_CurrentState[PORT_NUM];
extern  uint16_t Tbit[PORT_NUM]; //单个位的传输时间，在刚建立通信的时候确定。

//extern SM_DL_STATE_TYPE CMD_IN_OPERATE[PORT_NUM];// 暂时保存在Operate状态时候接收到的模式转换命令，用于DL_SetMode服务
#endif





